package es.udc.iagolast.androidJam.Activities;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import android.content.Context;
import android.content.pm.ActivityInfo;
import android.graphics.drawable.Drawable;
import android.location.LocationManager;
import android.os.Bundle;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;

import es.udc.iagolast.androidJam.Util.LinePathOverlay;
import es.udc.iagolast.androidJam.Util.MyItemizedOverlay;
import es.udc.iagolast.androidJam.Util.MyLocationListener;
import es.udc.iagolast.hellogooglemaps.R;

public class MainMapActivity extends MapActivity {
	private LocationManager locationManager;
	private MyLocationListener locationListener;
	private List<GeoPoint> list = new ArrayList<GeoPoint>();
	private MapView mapView = null;
	private Drawable meme = null;
	private Drawable beer = null;
	private Drawable call = null;
	private MyItemizedOverlay itemizedoverlayMeme = null;
	private MyItemizedOverlay itemizedoverlayBeer = null;
	private MyItemizedOverlay itemizedoverlayCall = null;
	private List<Overlay> mapOverlays;
	private int pollingTime = 0; // TODO: Esto tiene que llegar como parametro.
	private boolean first = true;
	private boolean called = false;
	private int minDistance = 0; // TODO: Esto tiene que llegar como parametro.
	private GeoPoint initPoint = new GeoPoint((int) (43.33277777777778f * 1E6),
			(int) (-8.410833333333334f * 1E6));
	private GeoPoint initPoint2 = new GeoPoint((int) (43.3328f * 1E6),
			(int) (-8.407f * 1E6));
	private GeoPoint initPoint3 = new GeoPoint((int) (43.34f * 1E6),
			(int) (-8.406f * 1E6));
	TelephonyManager phoneManager;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
		Log.d("DBG", "Iniciando...");
		// Pillamos los parametros del spinner
		pollingTime = getIntent().getIntExtra("pollingTime", 0);
		minDistance = getIntent().getIntExtra("minDistance", 0);
		setContentView(R.layout.activity_hello_google_maps);
		// Inicio todos los componentes necesarios.
		initComponents();
		// Creo 3 puntos por defecto en la pantalla.
		initPoints();
		// Centro el mapa en el punto de inicio
		mapView.getController().setCenter(initPoint);
		// Le asigno un zoo por defecto.
		mapView.getController().setZoom(15);
	}

	@Override
	public void onResume() {
		super.onResume();

	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.activity_hello_google_maps, menu);
		return true;
	}

	public void addPoint(GeoPoint point) {
		// Añado el nuevo puntoa la lista para luego unir todos.
		list.add(point);
		// Cojo la fecha y la hora y le doy formato
		Date date = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat("HH:mm");
		String s = formatter.format(date);
		// Creo un Overlay Item con el punto y la fecha y la hora recibido
		OverlayItem overlayitem1 = new OverlayItem(itemizedoverlayMeme
				.getLastPosition().getPoint(), itemizedoverlayMeme
				.getLastPosition().getTitle(), itemizedoverlayMeme
				.getLastPosition().getSnippet());
		OverlayItem overlayitem2 = new OverlayItem(point, "Hora:", s);
		if (first) {
			// Si primera vez que añadimos un elemento sobreescribimos la birra
			itemizedoverlayBeer.updateOverlay(overlayitem1);

			first = false;
		} else {
			if (!called) {
				itemizedoverlayBeer.addOverlay(overlayitem1);
			} else {
				called = false;
			}
		}
		// Actualizamos la posicion del meme.
		itemizedoverlayMeme.updateOverlay(overlayitem2);
		// Uno los dos ultimos puntos.
		if (list.size() > 1) {
			mapOverlays.add(new LinePathOverlay(list.get(list.size() - 1), list
					.get(list.size() - 2)));
		}
	}

	@Override
	protected boolean isRouteDisplayed() {
		return false;
	}

	private void initComponents() {
		// Cojo el mapa del xsml
		mapView = (MapView) findViewById(R.id.mapview);
		// Sacamos todas las capas del mapView
		mapOverlays = mapView.getOverlays();
		// Hacemos que sean visibles los controles de zoom.
		mapView.setBuiltInZoomControls(true);
		// Le pido al sistema un servicio de localizacion.
		locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
		// Instancio un listener que yo mismo cree
		locationListener = new MyLocationListener(this,
				mapView.getController(), this);
		// Determino la frecuencia de localizacion del gps.
		locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
				pollingTime, minDistance, locationListener);
		// Saco la imagen de dani de los recursos
		meme = this.getResources().getDrawable(R.drawable.meme);
		// Saco la imagen de dani de los recursos
		beer = this.getResources().getDrawable(R.drawable.beer);
		// Saco la imagen del telefono de los recursos.
		call = this.getResources().getDrawable(R.drawable.cell);
		// Instancio un item y le paso la imagen
		itemizedoverlayMeme = new MyItemizedOverlay(meme, this);
		// Instancio un item y le paso la imagen
		itemizedoverlayBeer = new MyItemizedOverlay(beer, this);
		// Instancio un item y le paso la imagen del telefono.
		itemizedoverlayCall = new MyItemizedOverlay(call, this);
		// Añado el nuevo itemizedOverlay a la lista.
		if (!mapOverlays.contains(itemizedoverlayBeer)) {
			mapOverlays.add(itemizedoverlayBeer);
		}
		// Añado el nuevo itemizedOverlay a la lista.
		if (!mapOverlays.contains(itemizedoverlayMeme)) {
			mapOverlays.add(itemizedoverlayMeme);
		}
		// Añado el nuevo itemizedOverlay a la lista.
		if (!mapOverlays.contains(itemizedoverlayCall)) {

			mapOverlays.add(itemizedoverlayCall);
		}
		phoneManager = (TelephonyManager) this
				.getSystemService(TELEPHONY_SERVICE);
		phoneManager.listen(myCallListener,
				PhoneStateListener.LISTEN_CALL_STATE);
	}

	private void initPoints() {
		// Creo un punto de inicio en la fic.
		OverlayItem overlayitem = new OverlayItem(initPoint, "About:",
				"Created to the AndroidJam Fic by:\n "
						+ "Iago Lastra Rodríguez\n Daniel Munín González \n Team: Chumachos");
		// Creo un punto de inicio en la fic para la birra.
		OverlayItem overlayitemBeer = new OverlayItem(initPoint2, "Tip:",
				"Each can represents an exact point where you have been");
		// Creo un punto de inicio en la fic para la birra.
		OverlayItem overlayitemCall = new OverlayItem(initPoint3, "Tip:",
				"When you talk, the app will register the call");
		// Le paso al itemized overlay el overlayItem
		itemizedoverlayMeme.addOverlay(overlayitem);
		// Le paso al itemized overlay el overlayItem
		itemizedoverlayBeer.addOverlay(overlayitemBeer);
		// Le paso al itemized overlay el overlayItem
		itemizedoverlayCall.addOverlay(overlayitemCall);

	}

	private PhoneStateListener myCallListener = new PhoneStateListener() {
		@Override
		public void onCallStateChanged(int state, String incomingNumber) {

			switch (state) {
			case TelephonyManager.CALL_STATE_OFFHOOK:
				OverlayItem overlayItem = new OverlayItem(itemizedoverlayMeme
						.getLastPosition().getPoint(), "Talked with: ",
						"666123456");
				itemizedoverlayCall.addOverlay(overlayItem);
				called = true;
				Log.d("DBG", "llamada descolgada" + "666123456");
				break;
			default:
				break;
			}
			super.onCallStateChanged(state, incomingNumber);
		}
	};

	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if (keyCode == KeyEvent.KEYCODE_BACK) {
			moveTaskToBack(true);
			return true;
		}
		return super.onKeyDown(keyCode, event);
	}
// */
}
